﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpDwgDxfInterface.h"
#include "IElementExportMethod.h"
#include <string>

namespace gcmp
{
    class IModelView;
    class IElement;
    class Vector3d;

    /// \brief 由用户对某些element进行定制导出方式。
    /// 
    class GCMP_DWG_DXF_INTERFACE_EXPORT IElementExportCustomizer
    {
    public:
        IElementExportCustomizer();
        virtual ~IElementExportCustomizer();

        /// \brief 由用户决定某element应该用什么方式导出。
        /// 
        /// \param pElement 需要导出的element。
        /// \param pExportMethod 导出方式。
        /// \param pErrorMessage 导出不成功时返回的错误信息。
        /// \return 返回true表示获取导出方式成功；返回false表示获取导出方式失败，则GCMP不对该element进行导出。
        virtual bool GetExportType(const IElement* pElement, IElementExportMethod* pExportMethod, std::wstring* pErrorMessage) const = 0;

        /// \brief 针对完全由用户导出的element进行导出的方法。
        /// 其它element由GCMP导出，但是GCMP会根据GetExportType提供的方式进行导出。
        /// 
        /// \param pDatabase 往导出的文件中写数据的database（当前使用OdDbDatabase*类型）。
        /// \param pModelView 需要导出的element对应的ModelView。
        /// \param pElement 需要导出的element。
        /// \param basePoint 该element导出时相对基准点。
        /// \param pErrorMessage 导出不成功时返回的错误信息。
        /// \return 返回true表示导出成功；返回false表示导出失败。
        virtual bool ExportByCustomizedMethod(void* pDatabase, const IModelView* pModelView, const IElement* pElement, const gcmp::Vector3d& basePoint, std::wstring* pErrorMessage) const = 0;

        /// \brief 克隆一个用户自定义的导出对象。
        /// 
        virtual OwnerPtr<IElementExportCustomizer> Clone() const = 0;
    };

}


